package com.jt.config;

import javax.servlet.FilterRegistration;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.web.filter.DelegatingFilterProxy;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

public class AppWebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
/**
 * 以下四个方法执行顺序，是我写出来的顺序从上往下执行的
 */
	@Override
	protected Class<?>[] getRootConfigClasses() {
		/*这个方法是在onStartUp方法后执行的，执行的时候会加载AppRootConfig这个类，这个类上我们加上了@ComponentScan注解，
		 * 该注解扫描了com.jt包下的除Controller注解修饰的所有类，并为相应的类创建对象，
		 * 上面两行想不通。
		 * 简单理解，这个方法执行时需要AppRootConfig.class，而AppRootConfig类里创建bean对象的时候需要ShiroUserRealm类型对象
		 * 但是此时容器内还没有这个对象，所以需要在AppRootConfig加上一个扫描注解，扫描到ShiroUserRealm这个类，就有了这个类的对象。
		 * */
		System.out.println("1+1");
		return new Class[]{AppRootConfig.class};
	}

	@Override
	protected Class<?>[] getServletConfigClasses() {
		System.out.println("2+2");
		return new Class[]{AppServletConfig.class};
	}

	@Override
	protected String[] getServletMappings() {
		System.out.println("3+3");
		return new String[]{"*.do"};
	}
	/**
	 * 这个方法比上面三个方法先执行
	 */
	@Override
	public void onStartup(ServletContext servletContext) throws ServletException {
		System.out.println("79878");
		//断点跟了下，这个地方会先调用getRootConfigClasses方法，getRootConfigClasses方法会携
		//带一个过滤器对象过来，这个过滤器对象就是来自AppRootConfig类下的一个
		//bean对象shiroFilter，shiroFilter对象构建时又需要ShiroUserRealm类型对象，
		//所以要先有ShrioUserRealm对象，所以要在AppRootConfig类上加一个扫描，扫描
		//到ShrioUserRealm类，并为其创建对象。
		super.onStartup(servletContext);
		/*注册filter对象，项目没有web.xml并且filter不是自己写的时候需要用下面这种方式进行注册
		 * Dynamic是的一个内部类
		 * */
		FilterRegistration.Dynamic dy = servletContext.addFilter("filterProxy",//过滤器的名字
				DelegatingFilterProxy.class );
		dy.setInitParameter("targetBeanName",//目标bean对象的名字
				"shiroFilter");//该参数为拦截器对象的id（name），我们在AppRootConfig类中配置了该bean对象
		dy.addMappingForUrlPatterns(null,//EnumSet<DispatcherType>拦截类型
				false,//默认就是false，不用管 
				"/*");//拦截所有的，相当于url-pattern,之前在过滤器是在web.xml文件里面配置的
	}
	
	
	
	
	
}
